{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<center>\n",
    "<img src=\"../../img/ods_stickers.jpg\">\n",
    "## Открытый курс по машинному обучению\n",
    "<center>Автор материала: Андрей Лукьяненко (@artgor)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Использование ipywidgets в jupyter notebook\n",
    "\n",
    "Виджеты в jupyter notebook - это по сути добавление к интерфейсу тетрадок. Они привносят интерактив, могут использоваться для хранения и передачи информации. С их помощью можно превратить тетрадку в нечто понятное простому пользователю и использовать как dashboard или простой аналитический инструмент.\n",
    "\n",
    "Вот что вы увидите:\n",
    "\n",
    "* как установить нужные библиотеки;\n",
    "* основные виды виджетов и как их можно использовать;\n",
    "* пример того, как можно сделать виджеты, позволяющие пользователю с помощью элементов интерейса визуализировать данные и попробовать машинное обучение;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Просмотр этого гайда.\n",
    "\n",
    "Самый простой способ работать с этой тетрадкой - использовать https://try.jupyter.org/. Это официальная возможность загрузить и запустить тетрадку."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Технические моменты\n",
    "\n",
    "Установка сама по себе не является сложной: это можно сделать через pip:\n",
    "\n",
    "```python\n",
    "pip install ipywidgets\n",
    "pip install widgetsnbextension\n",
    "jupyter nbextension enable --py widgetsnbextension\n",
    "```\n",
    "\n",
    "Или через Anaconda:\n",
    "\n",
    "```python\n",
    "conda install -c conda-forge ipywidgets\n",
    "conda install -c conda-forge widgetsnbextension\n",
    "```\n",
    "\n",
    "Но вот нюанс: установить-то легко, а вот заставить корректно работать - сложно. Если достаточно, чтобы всё работало в локальной тетрадке, то можно просто установить самые последние версии (только проверьте, что они последние, а то в канале может быть не самая последняя версия). Если же хочется, чтобы этим можно было поделиться, например, через nbviewer, нужно ставить ipywidgets 6.0.0 и widgetsnbextension 2.0.0 - nbviewer пока не поддерживает более новые версии. С другой стороны, nbviewer всё равно не может отображать все виджеты корректно."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Импорт библиотек\n",
    "import datetime\n",
    "import time\n",
    "\n",
    "import ipywidgets as widgets\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "from ipywidgets import interact, interact_manual, interactive\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "from IPython.display import display"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Основные способы использования виджетов"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Во-первых, можно просто отобразить виджет сам по себе."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "widgets.IntSlider()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Но это просто создаёт слайдер, с которым можно поиграться, а пользы от него нет. Следующим шагом является создание переменной с виджетом"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "w = widgets.IntSlider(value=2)\n",
    "w"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "И теперь мы можем получить значение виджета и использовать для чего-нибудь."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(w.value, w.value ** 2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Другой вариант - отображение виджета с помощью функции IPython display; это работает точно также как и сам вызов переменной."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "display(w)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Вы передвигали слайдер в прошлой ячейке? Если нет - попробуйте. Можно заметить, что слайдер двигается в обеих ячейках, где была использована переменная w. Это нормальное поведение - у нас есть лишь один объект на back-end, так что получаются синхронизированные объекты на front-end.\n",
    "\n",
    "После того как в виджете было установлено некое значение, виджет можно закрыть командой `w.close()`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Пока мы видели простые виджеты, значения которых можно было использовать в дальнейшем. Если же хочется, чтобы с выбранным значением что-то произошло сразу, стоит использовать `interact`. `interact` позволяет вызывать функцию, в которую передаётся значение виджета. При изменении значения виджета функция будет динамически показывать обновлённый результат."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def f(x):\n",
    "    return x, str(x) * 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "interact(f, x=10);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Замечу, что в `interact` обязательно передавать начальное значение, поскольку это напрямую определяет тип виджета. Если передать int или float, то будет слайдер с соответствующими данными (как это показано выше).\n",
    "\n",
    "Кроме того можно передать:\n",
    "\n",
    "* текст для получения поля ввода текста;\n",
    "* список/словарь значений для выпадающего списка;\n",
    "* булевое значение для чекбокса;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "interact(f, x='Текст');\n",
    "interact(f, x=['лопата', 'солнце']);\n",
    "interact(f, x=True);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Кому-то может быть интересна возможность использовать `interact` в качестве декоратора. В таком случае функцию можно не передавать в `interact`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "@interact(x=1.0)\n",
    "def g(x):\n",
    "    return x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Наконец, есть такая интересная штука как `interactive`. По сути это является комбинацией двух предыдущих спообов: мы задаем функцию, а потом можем использовать как сами результаты, так и значения отдельных виджетов.\n",
    "\n",
    "По умолчанию `interactive` показывает только сами виджеты, но не результат функции. Чтобы увидеть результат, надо явно его отображать, используя `display`.\n",
    "\n",
    "Замечу, что можно использовать больше одной переменной и получить больше одного виджета."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def f(x, y, z):\n",
    "    if z == 'Сумма':\n",
    "        display(x + y)\n",
    "        return x + y\n",
    "    else:\n",
    "        display(x * y)\n",
    "        return x * y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "w = interactive(f, x=1, y=2.5, z=['Сумма', 'Произведение'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "w"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(w.kwargs)\n",
    "print(w.result)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Применение виджетов\n",
    "\n",
    "До сих пор я показывал отдельные виджеты и простые способы их использования, но с ними можно делать много интересных вещей. Просто перечислять их довольно нудно, поэтому я буду приводить примеры и на их основе объяснять возможности."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Динамически изменяющиеся графики\n",
    "\n",
    "Мы уже видели, что в `interact` можно передавать функцию, результат которой будет обновляться при изменении параметров. Интереснее посмотреть это на примере построения графиков. Я хочу сделать график, который будет зависеть от задаваемого параметра, а также предложить возможность выбирать цвет графика."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Для начала нужно создать виджет для выбора цвета. Вообще говоря виджеты можно передавать в функцию как значение параметра, но это громоздко, поэтому удобнее создать виджет, а потом передавать его в виде переменной.\n",
    "\n",
    "Виджеты имеют 2 группы свойств: общие (например, описание или начальное значение) и специфичные для типа виджета (например, границы для числовых виджетов).\n",
    "\n",
    "Этот виджет имеет следующие параметры:\n",
    "* concise - не показывает название выбранного цвета, если True;\n",
    "* description - описание, этот параметр есть у всех виджетов;\n",
    "* value - значение по умолчанию, опять же есть почти у всех виджетов;\n",
    "* disabled - возможность изменения значения виджета;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pick_color = widgets.ColorPicker(\n",
    "    concise=False,\n",
    "    description='Цвет линии:',\n",
    "    value='teal',\n",
    "    disabled=False\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Теперь сам интерактивный виджет. Функция для построения графика будет иметь 2 параметра:\n",
    "* n - просто некий параметр, который будет изменять функцию;\n",
    "* c - цвет линии;\n",
    "\n",
    "Далее использую `interact`:\n",
    "* для n я передаю список значений, которые можно выбрать. В функции значение по умолчанию 3, именно оно будет выбрано по умолчанию;\n",
    "* для цвета значением будет переменная с виджетом для выбора цвета. Цвет можно выбирать через диалоговое окошко или напрямую вводить название или код в поле. Стоит заметить, что значением по умолчанию является не orange, а teal, поскольку значение в виджете имеет более высокий приоритет;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def h(n=3, c='orange'):\n",
    "    x = np.linspace(0, 5, 10)\n",
    "    plt.plot(x, x ** (n / (x + 1)) + x ** (x / n) / (n ** 2) + (n - x) ** 2 - x * np.log(n) + n * np.exp(x / n),  color=c)\n",
    "    plt.show()\n",
    "\n",
    "interact(h, n=[i for i in range(2, 6)], c=pick_color);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Действие при нажатии на кнопку\n",
    "\n",
    "Виджеты позволяют делать вызов функции после определённых событий:\n",
    "\n",
    "* При нажатии на кнопку;\n",
    "* При завершении ввода текста;\n",
    "* По мере изменения значения (обычно используется для слайдеров);\n",
    "\n",
    "Кроме того можно связать виджеты - чтобы при изменении значения одного виджета изменялось значение другого виджета.\n",
    "\n",
    "Рассмотрим пример: пользователь задаёт длины сторон прямоугольника и хочет узнать его площадь. Для начала я задаю 2 виджета с соответсвующими названиями. Для ограничения значений можно задать минимальное и максимальное значение, а также шаг, с которым будут изменяться значения."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x1 = widgets.IntSlider(min=2, max=40.0, step=2, description='Высота')\n",
    "x2 = widgets.FloatSlider(min=2, max=80.0, step=0.5, description='Ширина', value=5.0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Добавим ограничение - высота прямоугольника не может быть больше его ширины. Для этого используется `observe` - при каждом изменении объекта мгновенно вызывается функция. А в функции мы будет приравнивать максимальное значение виджета x к текущему значению виджета y."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def update_x1_range(*args):\n",
    "    x1.max = x2.value\n",
    "    \n",
    "x2.observe(update_x1_range, 'value')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Теперь создадим кнопку, при нажатии на которую будет происходить вычисление. Для этого задаём соответствующий объект. И здесь в первый раз используется настройка внешнего вида виджетов. `layout` позволяет настраивать css объектов. Большинство параметров взять из самого CSS, но есть и различия, почитать подробнее можно [тут](#http://ipywidgets.readthedocs.io/en/stable/examples/Widget%20Styling.html). В данном случае я просто задаю ширину кнопки.\n",
    "\n",
    "При нажатии на кнопку будет показана площадь прямоугольника, кнопка и слайдеры станут неактивными (значение `disabled` становится `True`)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "button1 = widgets.Button(description=\"Нажмите, чтобы посчитать площадь прямоугольника!\", layout=widgets.Layout(width='40%'))\n",
    "\n",
    "def on_button_clicked(b):\n",
    "    print('Площадь прямоугольника: {}.'.format(x1.value * x2.value))\n",
    "    button1.disabled = True\n",
    "    x1.disabled = True\n",
    "    x2.disabled = True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def stat(x1, x2):\n",
    "    print('Высота: {0}. Ширина: {1}.'.format(x1, x2))\n",
    "    \n",
    "interact(stat, x1=x1, x2=x2);\n",
    "display(button1)\n",
    "button1.on_click(on_button_clicked)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Для полноты картины добавлю ещё одну кнопку, которая откроет данные для ввода, чтобы можно было ещё раз посчитать площать прямоугольника.\n",
    "\n",
    "Стоит заметить, что старые результаты по умолчанию остаются, а новые появляются на следующих строках."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "button2 = widgets.Button(description=\"Использовать другие данные\", layout=widgets.Layout(width='40%'))\n",
    "\n",
    "def on_button_clicked2(b):\n",
    "    button1.disabled = False\n",
    "    x1.disabled = False\n",
    "    x2.disabled = False\n",
    "    \n",
    "display(button2)\n",
    "button2.on_click(on_button_clicked2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Имитация оформления заказа на товар\n",
    "\n",
    "На основе игрушечного примера о заказе компьютера я продемонстрирую большое количество разнообразных виджетов и то, как они могут быть использованы."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Для начала мы предлагаем пользователю выбрать интересующий его товар. Этот виджет позволяет выбрать одно значение из списка."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('Выбор товара:')\n",
    "pc_type = widgets.Select(\n",
    "    options=['Компьютер', 'Планшет', 'Ноутбук'],\n",
    "    value='Компьютер',\n",
    "    description='Товар:'\n",
    ")\n",
    "pc_type"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Теперь предложим указать количество товара. `jslink` связывает 2 виджета, имеющих сравнимые значения (например числа), либо изменяет значения виджетов согласно заданному правилу (например, при положительных значениях получается один текст, при неотрицательных - другой).\n",
    "\n",
    "Также здесь используется новый виджет - `BoundedIntText`. Это поле для ввода integer, для которого можно задать минимальные и максимальные значения. Можно попробовать ввести значение вне заданных пределов, но после того, как будет выделено что-то другое, значение сбросится к ближайшему значению из пределов."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = widgets.BoundedIntText(min=1, max=5)\n",
    "b = widgets.IntSlider(min=1, max=5)\n",
    "print('Укажите количество - введите число или выберите нужное значение')\n",
    "display(a, b)\n",
    "mylink = widgets.jslink((a, 'value'), (b, 'value'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "В качестве шутки предложим выбрать мощность покупаемой техники. Для этого используется виджет-слайдер для которого можно добавить ранжированный список текстовых значений."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "power = widgets.SelectionSlider(\n",
    "    options=['калькулятор', 'хороший', 'мощный', 'deep learning', 'kaggle'],\n",
    "    value='хороший',\n",
    "    description='Мощность:',\n",
    "    disabled=False,\n",
    "    orientation='horizontal',\n",
    "    readout=True, layout=widgets.Layout(width='40%')\n",
    ")\n",
    "power"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "А теперь подарим клиенту бонус. Это виджет для множественного выбора с помощью клавиш Ctrl/Shift."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "sel_mult = widgets.SelectMultiple(\n",
    "    options=['Ручка', 'Стикер', 'Скидка'],\n",
    "    value=['Стикер'],\n",
    "    #rows=10,\n",
    "    description='Бонусы:',\n",
    "    disabled=False\n",
    ")\n",
    "sel_mult"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Заказ укомплектован, теперь пора обговорить условия доставки. Первое - как будет доставлен товар. `RadioButtons`, как и `Select`, даёт возможность выбора одной опции.\n",
    "\n",
    "Заодно познакомимся с такой удобной штукой как `HBo`x. Он позволяет делать более гибкую настройку отображения виджетов и их описания. Например, изменять ширину описания виджета можно его свойствами, а можно описание и виджет вложить внутрь `Box`. `HBox` и `VBox` являются соответственно горизонтальными и вертикальными контейнерами для виджетов или их описаний."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "delivery = widgets.RadioButtons(\n",
    "    options=['Доставка', 'Самовывоз'],\n",
    "    disabled=False\n",
    ")\n",
    "widgets.HBox([widgets.Label(value=\"Способ доставки:\"), delivery])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Настала пора выбрать способ оплаты. `ToggleButtons` выводит кнопки, одна из которых может быть нажата. Виджет позволяет настроить названия кнопок, всплывающие тултипы и даже иконки (для задания иконок используются названия иконок для Font Awesome).\n",
    "\n",
    "Также здесь используется задание параметров виджета используя `style`. Это дополнительный способ (по отношению к `layout`), но это уже не css, а внутренние свойства виджетов. Есть ряд свойств, которые относятся только к определённым виджетам."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pay_method = widgets.ToggleButtons(\n",
    "    options=['Карта', 'Наличные'],\n",
    "    description='Способ оплаты:',\n",
    "    disabled=False,\n",
    "    button_style='success',\n",
    "    tooltips=['Карта', 'Наличные'],\n",
    "     icons=['credit-card', 'money']\n",
    ")\n",
    "pay_method.style.button_width='100px'\n",
    "pay_method"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ещё есть виджет для выбора даты доставки."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "date = widgets.DatePicker(\n",
    "    description='',\n",
    "    disabled=False\n",
    ")\n",
    "date\n",
    "\n",
    "widgets.VBox([widgets.Label(value=\"Дата доставки:\"), date])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Дата вполне может быть выбрана неверно. Допустим мы позволяет выбрать дату в промежутке от 2 до 7 дней от текущего. Сделаем проверку.\n",
    "\n",
    "Для отображения результата будет использован виджет `Valid`, который показывает валидность."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "button3 = widgets.Button(description=\"Проверить дату\", layout=widgets.Layout(width='40%'))\n",
    "\n",
    "def on_button_clicked3(d):\n",
    "    valid = widgets.Valid(\n",
    "        value=False,\n",
    "        description='Корректная дата!',\n",
    "        )\n",
    "    valid.style.description_width='200px'\n",
    "    \n",
    "    if date.value == None:\n",
    "        valid.description='Некорректная дата!'\n",
    "        display(valid)\n",
    "        print('Дата доставки не указана.')\n",
    "    elif (date.value - datetime.datetime.today().date()).days in range(2,8):\n",
    "        valid.value = True\n",
    "        display(valid)\n",
    "    else:\n",
    "        valid.description='Некорректная дата!'\n",
    "        display(valid)\n",
    "        print('Дата доставки должна быть в периоде 2-7 дней от текущей даты.')\n",
    "    \n",
    "display(button3)\n",
    "button3.on_click(on_button_clicked3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Теперь можно выбрать время дня, в которое следует осуществить доставку. `IntRangeSlider` позволяет указать интервал."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "period = widgets.IntRangeSlider(\n",
    "    value=[9, 18],\n",
    "    min=7,\n",
    "    max=22,\n",
    "    step=1,\n",
    "    description='Время:',\n",
    "    disabled=False,\n",
    "    continuous_update=False,\n",
    "    orientation='vertical',\n",
    "    readout=True,\n",
    "    readout_format='',\n",
    ")\n",
    "period"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "И, конечно, есть виджет для ввода текста. Для ввода короткого текста можно использовать Text, для текста побольше - Textarea.\n",
    "\n",
    "Здесь мы видим событие on_submit при вводе текста - оно происходит после ввода текста и нажатия Enter."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "text_comment = widgets.Text(\n",
    "    value=' ',\n",
    "    description='Комментарий к доставке:',\n",
    "    disabled=False\n",
    ")\n",
    "text_comment\n",
    "\n",
    "def text_submit(t=text_comment):\n",
    "    print(\"Комментарий '{0}' зафиксирован.\".format(text_comment.value.strip()))\n",
    "    \n",
    "text_comment.style.description_width='200px'\n",
    "display(text_comment)\n",
    "text_comment.on_submit(text_submit)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Заказ оформлен, теперь надо бы показать клиенту все, что он указывал раньше, и предложить ввести адрес доставки. Первый вариант этого - сделать вложенные `VBox` и `HBox`, второй вариант - использовать `Accordion` и `Tab`.\n",
    "\n",
    "Предварительно я \"поворачиваю\" слайдер для выбора временного периода доставки в горизонтальное положение, а также создаю новый виджет для ввода адреса доставки. `Textarea` позволяет задавать значение по умолчанию, а также значение, которое будет отображаться, если очистить поле.\n",
    "\n",
    "Виджет `Tab` содержит в себе `Accordion`. `Accordion`, в свою очередь, содержит в себе обычные виджеты, каждый из которых хранится на отдельной мини-вкладке. Это осуществляется перез параметр `children`. Названия этих мини-вкладок задаются для соответствующих индексов через `set_title`. Подобным образом `Accordion` вкладывается в `Tab`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "period.orientation='horizontal'\n",
    "address = widgets.Textarea(\n",
    "    value='Адрес',\n",
    "    placeholder='Не дом и не улица',\n",
    "    description='Адрес:',\n",
    "    disabled=False\n",
    ")\n",
    "\n",
    "tab_nest = widgets.Tab()\n",
    "accordion1 = widgets.Accordion(children=[pc_type, b, power, sel_mult])\n",
    "accordion1.set_title(0, 'Товар:')\n",
    "accordion1.set_title(1, 'Количество:')\n",
    "accordion1.set_title(2, 'Мощность:')\n",
    "accordion1.set_title(3, 'Бонус:')\n",
    "\n",
    "\n",
    "accordion2 = widgets.Accordion(children=[widgets.HBox([widgets.Label(value=\"Способ доставки:\"), delivery]),\n",
    "                                        pay_method,\n",
    "                                        widgets.VBox([widgets.Label(value=\"Дата доставки:\"), date]),\n",
    "                                        period,\n",
    "                                        text_comment, address])\n",
    "accordion2.set_title(0, 'Способ доставки:')\n",
    "accordion2.set_title(1, 'Способ оплаты:')\n",
    "accordion2.set_title(2, 'Дата доставки:')\n",
    "accordion2.set_title(3, 'Время доставки:')\n",
    "accordion2.set_title(4, 'Комментарий:')\n",
    "accordion2.set_title(5, 'Адрес доставки:')\n",
    "\n",
    "\n",
    "tab_nest.children = [accordion1, accordion2]\n",
    "tab_nest.set_title(0, 'Заказ:')\n",
    "tab_nest.set_title(1, 'Доставка:')\n",
    "tab_nest"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "На завершающем этапе пользователь видит итоговую информацию о заказе.\n",
    "Во-первых, используется виджет для отображения прогресса. Самый удобный способ обновлять его значение - увеличивать его `value` при определенном событии."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "progress = widgets.IntProgress(\n",
    "    value=0,\n",
    "    min=0,\n",
    "    max=10,\n",
    "    step=1,\n",
    "    description='',\n",
    "    bar_style='success',\n",
    "    orientation='horizontal'\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ещё один интересный виджет - `Out`. Он отображает то, что передаётся в него: это может быть просто печать данных через `print`, rich text, media и другие вещи."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "out = widgets.Output()\n",
    "out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "button4 = widgets.Button(description=\"Проверить данные\", layout=widgets.Layout(width='40%'))\n",
    "\n",
    "def on_button_clicked4(d):\n",
    "    with out:\n",
    "        display(widgets.VBox([widgets.Label(value=\"Проверка информации  заказе:\"), progress]))\n",
    "        print('Информация о заказе:')\n",
    "        for i in range(len(accordion1.children)):\n",
    "            if type(accordion1.children[i].value) != tuple:\n",
    "                print(accordion1.get_title(i), accordion1.children[i].value)\n",
    "                progress.value +=1\n",
    "                time.sleep(0.5) \n",
    "            else:\n",
    "                print(accordion1.get_title(i), ' '.join([j for j in accordion1.children[i].value]))\n",
    "                progress.value +=1\n",
    "                time.sleep(0.5) \n",
    "                #print(accordion1.get_title(i)), [print(j) for j in accordion1.children[i].value]\n",
    "        for i, e in enumerate([delivery, pay_method, date, period, text_comment, address]):\n",
    "            print(accordion2.get_title(i), e.value)\n",
    "            progress.value +=1\n",
    "            time.sleep(0.5) \n",
    "display(button4)\n",
    "button4.on_click(on_button_clicked4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "Поскольку этот гайд о виджетах, а не об оформлении доставки, я не делаю много вещей, которые следовало бы делать: проверка на заполненность и адекватность значений, разные возможности при выборе самовывоза и доставки и т. д."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Я описал почти все возможности и способы применения ipywidgets. Есть ещё некоторые, но они являются более глубокими и будут реже использоваться, поэтому не буду заострять на этом внимание."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Интерактивное исследование данных и машинное обучение\n",
    "\n",
    "Поскольку наш курс посвящён машинному обучению, я решил сделать дополнительную часть, где с помощью виджетов можно поиграть с датасетом iris и попробовать разные алгоритмы машинного обучения. Это простой пример того, как виджеты могут использоваться для создания интерфейса, который может быть понятным простому пользователю."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "В ячейке ниже будет импорт всех библиотек, определение функций и задание виджетов, чтобы дальше ничто не отвлекало от взаимодействия с интерфейсом. В этой ячейке содержится следующее:\n",
    "\n",
    "1. Загрузка датасет iris с помощью sklearn, создание переменных для самих данных и для таргета, а также DataFrame со всеми данными для удобства визуализации.\n",
    "2. Функция для построения pairplot, где можно выбрать значения для двух параметров.\n",
    "3. Функция для построения графика, показывающего распределение данных. Можно выбрать переменную и тип графика - distplot, boxplot, stripplot.\n",
    "4. 2 виджета для определения параметров разбиения данных на тренировочные и валидационные.\n",
    "5. Функция для построения графика, показывающая как именно модель разделяет данные. Взято из sklearn.\n",
    "6. Далее несколько функций для того, чтобы можно было \"пощупать\" различные алгоритмы машинного обучения: KNeighborsClassifier, LogisticRegression, SVC, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier. Принцип работы одинаков: вначале применяется PCA, чтобы снизить размерность с 4 до 2 переменных - для удобства визуализации; далее данные разбиваются на тренировочные и валидационные, запускается модель с выбранными параметрами, вызывается функция из прошлого пункта для построения графика и отображается точность модели.\n",
    "7. Для кластеризации KMeans построение графика выглядит немного по-другому, опять же взято из sklearn. И разбиение данных не требуется.\n",
    "\n",
    "Стоит заметить, что для запуска классификации используется `interact_manual`, а не просто `interact`. В результате появляется кнопка для запуска, и не происходит автоматический пересчёт результатов. Это довольно удобно, иначе при передвижении слайдеров модели несколько раз пересчитывались бы."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import linear_model\n",
    "from sklearn.cluster import KMeans\n",
    "from sklearn.datasets import load_iris\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.metrics import adjusted_rand_score\n",
    "from sklearn.model_selection import cross_val_score, train_test_split\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.neural_network import MLPClassifier\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "iris = load_iris()\n",
    "X = iris.data\n",
    "y = iris.target\n",
    "data = pd.DataFrame(np.concatenate((X, y.reshape(-1, 1)), axis=1), columns=iris.feature_names + ['y'])\n",
    "\n",
    "def pp(kind='scatter', diag_kind='hist'):\n",
    "    sns.pairplot(data, hue='y', kind=kind, diag_kind=diag_kind, vars=iris.feature_names);\n",
    "    \n",
    "def dp(graph_type='distr', variable=iris.feature_names[0]):\n",
    "    if graph_type == 'distr':\n",
    "        sns.distplot(data[variable]);\n",
    "    elif graph_type == 'box':\n",
    "        sns.boxplot(y=variable, orient='v', width=0.2, x=\"y\", data=data)\n",
    "    else:\n",
    "        sns.stripplot(x=\"y\", y=variable, data=data, jitter=True);\n",
    "        \n",
    "c = widgets.Checkbox(\n",
    "    value=True,\n",
    "    description='Stratify',\n",
    "    disabled=False\n",
    ")\n",
    "ts = widgets.FloatSlider(value=0.25, min=0.05, max=0.4, description='Test_size', step=0.05)\n",
    "ts.style.handle_color = 'lightblue'\n",
    "\n",
    "def plot_graph(clf, X_train, y_train):\n",
    "    x_min, x_max = X_train[:, 0].min() - .5, X_train[:, 0].max() + .5\n",
    "    y_min, y_max = X_train[:, 1].min() - .5, X_train[:, 1].max() + .5\n",
    "    xx, yy = np.meshgrid(np.arange(x_min, x_max, .02), np.arange(y_min, y_max, .02))\n",
    "    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])\n",
    "\n",
    "    Z = Z.reshape(xx.shape)\n",
    "    plt.figure(1, figsize=(4, 3))\n",
    "    plt.pcolormesh(xx, yy, Z)\n",
    "    plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, edgecolor='k')\n",
    "    plt.xlim(xx.min(), xx.max())\n",
    "    plt.ylim(yy.min(), yy.max())\n",
    "    plt.xlabel('Признак 1')\n",
    "    plt.ylabel('Признак 2')\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "def kn(n_neighbors=5, weights='uniform', test_size=ts.value, strat=c.value):\n",
    "    X1 = PCA(n_components=2).fit_transform(X)\n",
    "    if c.value == True:\n",
    "        X_train, X_valid, y_train, y_valid = train_test_split(X1, y, test_size=test_size, stratify=y)\n",
    "    else:\n",
    "        X_train, y_train, X_valid, y_valid = train_test_split(X1, y, test_size=test_size, stratify=None)\n",
    "    \n",
    "    clf = KNeighborsClassifier(n_neighbors=n_neighbors, weights=weights)\n",
    "    clf.fit(X_train, y_train)\n",
    "    plot_graph(clf, X_train, y_train)\n",
    "\n",
    "    print('Точность на кросс-валидации: {0:.2f}%.'.format(cross_val_score(clf, X_train, y_train).mean() * 100))\n",
    "    print('Точность на отложенной выборке: {0:.2f}%.'.format((np.sum(y_valid == clf.predict(X_valid)) / len(y_valid)) * 100))\n",
    "\n",
    "    \n",
    "def lr(reg=1.0, fi=True, solver='newton-cg', multi_class='ovr', test_size=ts.value, strat=c.value):\n",
    "    X1 = PCA(n_components=2).fit_transform(X)\n",
    "    if c.value == True:\n",
    "        X_train, X_valid, y_train, y_valid = train_test_split(X1, y, test_size=test_size, stratify=y)\n",
    "    else:\n",
    "        X_train, y_train, X_valid, y_valid = train_test_split(X1, y, test_size=test_size, stratify=None)\n",
    "    \n",
    "    clf = linear_model.LogisticRegression(C=reg, fit_intercept=fi, solver=solver, max_iter=1000, multi_class=multi_class)\n",
    "    clf.fit(X_train, y_train)\n",
    "    plot_graph(clf, X_train, y_train)\n",
    "\n",
    "    print('Точность на кросс-валидации: {0:.2f}%.'.format(cross_val_score(clf, X_train, y_train).mean() * 100))\n",
    "    print('Точность на отложенной выборке: {0:.2f}%.'.format((np.sum(y_valid == clf.predict(X_valid)) / len(y_valid)) * 100))\n",
    "\n",
    "    \n",
    "def svc(reg=1.0, kernel=True, sfs='ovr', test_size=ts.value, strat=c.value):\n",
    "    X1 = PCA(n_components=2).fit_transform(X)\n",
    "    if c.value == True:\n",
    "        X_train, X_valid, y_train, y_valid = train_test_split(X1, y, test_size=test_size, stratify=y)\n",
    "    else:\n",
    "        X_train, y_train, X_valid, y_valid = train_test_split(X1, y, test_size=test_size, stratify=None)\n",
    "    \n",
    "    clf = SVC(C=reg, kernel=kernel, decision_function_shape=sfs)\n",
    "    clf.fit(X_train, y_train)\n",
    "    plot_graph(clf, X_train, y_train)\n",
    "\n",
    "    print('Точность на кросс-валидации: {0:.2f}%.'.format(cross_val_score(clf, X_train, y_train).mean() * 100))\n",
    "    print('Точность на отложенной выборке: {0:.2f}%.'.format((np.sum(y_valid == clf.predict(X_valid)) / len(y_valid)) * 100))\n",
    "\n",
    "    \n",
    "def dt(criterion='gini', min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, test_size=ts.value,\n",
    "       strat=c.value):\n",
    "    X1 = PCA(n_components=2).fit_transform(X)\n",
    "    if c.value == True:\n",
    "        X_train, X_valid, y_train, y_valid = train_test_split(X1, y, test_size=test_size, stratify=y)\n",
    "    else:\n",
    "        X_train, y_train, X_valid, y_valid = train_test_split(X1, y, test_size=test_size, stratify=None)\n",
    "    \n",
    "    clf = DecisionTreeClassifier(criterion=criterion, max_depth=None, min_samples_split=2, min_samples_leaf=min_samples_leaf,\n",
    "                                 min_weight_fraction_leaf=min_weight_fraction_leaf, max_features=None)\n",
    "    clf.fit(X_train, y_train)\n",
    "    plot_graph(clf, X_train, y_train)\n",
    "\n",
    "    print('Точность на кросс-валидации: {0:.2f}%.'.format(cross_val_score(clf, X_train, y_train).mean() * 100))\n",
    "    print('Точность на отложенной выборке: {0:.2f}%.'.format((np.sum(y_valid == clf.predict(X_valid)) / len(y_valid)) * 100))\n",
    "\n",
    "    \n",
    "def rf(n_estimators=10, criterion='gini', min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0,\n",
    "       test_size=ts.value, strat=c.value):\n",
    "    X1 = PCA(n_components=2).fit_transform(X)\n",
    "    if c.value == True:\n",
    "        X_train, X_valid, y_train, y_valid = train_test_split(X1, y, test_size=ts.value, stratify=y)\n",
    "    else:\n",
    "        X_train, y_train, X_valid, y_valid = train_test_split(X1, y, test_size=ts.value, stratify=None)\n",
    "    \n",
    "    clf = RandomForestClassifier(n_estimators=10, criterion=criterion, max_depth=None, min_samples_split=min_samples_split,\n",
    "                                 min_samples_leaf=min_samples_leaf, min_weight_fraction_leaf=min_weight_fraction_leaf,\n",
    "                                 max_features='auto')\n",
    "    clf.fit(X_train, y_train)\n",
    "    plot_graph(clf, X_train, y_train)\n",
    "\n",
    "    print('Точность на кросс-валидации: {0:.2f}%.'.format(cross_val_score(clf, X_train, y_train).mean() * 100))\n",
    "    print('Точность на отложенной выборке: {0:.2f}%.'.format((np.sum(y_valid == clf.predict(X_valid)) / len(y_valid)) * 100))\n",
    "\n",
    "    \n",
    "def mlp(hidden_layers=10, nodes=100, activation='relu', solver='adam', alpha=0.0001, test_size=ts.value, strat=c.value):\n",
    "    X1 = PCA(n_components=2).fit_transform(X)\n",
    "    if c.value == True:\n",
    "        X_train, X_valid, y_train, y_valid = train_test_split(X1, y, test_size=ts.value, stratify=y)\n",
    "    else:\n",
    "        X_train, y_train, X_valid, y_valid = train_test_split(X1, y, test_size=ts.value, stratify=None)\n",
    "    \n",
    "    clf = MLPClassifier(hidden_layer_sizes=tuple([nodes for i in range(3)]), activation=activation, solver=solver,\n",
    "                        alpha=alpha, max_iter=2000)\n",
    "    clf.fit(X_train, y_train)\n",
    "    plot_graph(clf, X_train, y_train)\n",
    "\n",
    "    print('Точность на кросс-валидации: {0:.2f}%.'.format(cross_val_score(clf, X_train, y_train).mean() * 100))\n",
    "    print('Точность на отложенной выборке: {0:.2f}%.'.format((np.sum(y_valid == clf.predict(X_valid)) / len(y_valid)) * 100))\n",
    "    \n",
    "def km(n_clusters=3):\n",
    "    reduced_data = PCA(n_components=2).fit_transform(X)\n",
    "\n",
    "    kmeans = KMeans(init='k-means++', n_clusters=n_clusters)\n",
    "    kmeans.fit(reduced_data)\n",
    "    x_min, x_max = reduced_data[:, 0].min() - 1, reduced_data[:, 0].max() + 1\n",
    "    y_min, y_max = reduced_data[:, 1].min() - 1, reduced_data[:, 1].max() + 1\n",
    "    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02))\n",
    "\n",
    "    Z = kmeans.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)\n",
    "\n",
    "    plt.figure(1)\n",
    "    plt.imshow(Z, interpolation='nearest',\n",
    "               extent=(xx.min(), xx.max(), yy.min(), yy.max()),\n",
    "               cmap=plt.cm.Paired,\n",
    "               aspect='auto', origin='lower')\n",
    "\n",
    "    plt.plot(reduced_data[:, 0], reduced_data[:, 1], 'k.', markersize=2)\n",
    "\n",
    "    centroids = kmeans.cluster_centers_\n",
    "    plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', s=169, linewidths=3, color='w', zorder=10)\n",
    "    plt.title('K-means кластеризация')\n",
    "    plt.xlim(x_min, x_max)\n",
    "    plt.ylim(y_min, y_max)\n",
    "    plt.xlabel('Признак 1')\n",
    "    plt.ylabel('Признак 2')\n",
    "    plt.show()\n",
    "    \n",
    "    print('Adjusted Rand Index: {0:.2f}%.'.format(adjusted_rand_score(y, kmeans.labels_) * 100))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('Pairplot показывает взаимодействие между переменными в датасете')\n",
    "interact(pp, kind=['scatter', 'reg'], diag_kind=['hist', 'kde']);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('Распределение переменных:')\n",
    "interact(dp, graph_type=['distr', 'box', 'swarm'], variable=iris.feature_names);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('Параметры разбиения тренировочных данных:')\n",
    "display(ts)\n",
    "display(c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('Кластеризация с помощью KMeans:')\n",
    "interact_manual(km, n_clusters=(2,50));"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('Классификация с помощью KNeighborsClassifier:')\n",
    "interact_manual(kn, n_neighbors=(1,50), weights=['uniform', 'distance']);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('Классификация с помощью Logistic Regression:')\n",
    "interact_manual(lr, reg=np.logspace(-3, 1, 10), fi=True, solver=['newton-cg', 'sag', 'saga', 'lbfgs'],\n",
    "         multi_class=['ovr', 'multinomial']);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('Классификация с помощью SVC:')\n",
    "interact_manual(svc, reg=np.logspace(-3, 1, 10), kernel=['linear', 'poly', 'rbf', 'sigmoid'], sfs=['ovr', 'ovo']);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('Классификация с помощью Decision Tree:')\n",
    "interact_manual(dt, criterion=['gini', 'entropy'], min_samples_split=(2,30), min_samples_leaf=(1,30),\n",
    "         min_weight_fraction_leaf=(0.0, 0.5));"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('Классификация с помощью Random Forest:')\n",
    "interact_manual(rf, n_estimators=(2, 100), criterion=['gini', 'entropy'], min_samples_split=(2,30), min_samples_leaf=(1,30),\n",
    "         min_weight_fraction_leaf=(0.0, 0.5));"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('Классификация с помощью Multi-layer Perceptron:')\n",
    "interact_manual(mlp, hidden_layers=(1, 10), nodes=(3, 100),  activation=['identity', 'logistic', 'tanh', 'relu'],\n",
    "         solver=['lbfgs', 'sgd', 'adam'], alpha=np.logspace(-3, 1, 10));"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "075b4f6bf6e040dda2cd918a928e98fa": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "0c10bd7b484a4923a0fd7dd0ffca17e1": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "FloatSliderModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "y",
       "layout": "IPY_MODEL_7cf534ae09514ec2aae1b1acf3716b4e",
       "max": 7.5,
       "min": -2.5,
       "step": 0.1,
       "value": 2.5
      }
     },
     "0c998e92497e4ac59852e2e69180b09e": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "0cadd83fecb14d4c8b041c76662d3994": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "SelectionSliderModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_options_labels": [
        "слабый",
        "хороший",
        "мощный",
        "deep learning"
       ],
       "_view_module_version": "~2.1.4",
       "continuous_update": false,
       "description": "Мощность:",
       "layout": "IPY_MODEL_8bace233ef15420c85416c33192009e3",
       "value": "хороший"
      }
     },
     "0e7a623192da41a49210e53035dae6ea": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "1250d511dbdb45cc9fb415c125081c72": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "IntSliderModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_bd792bd8ea4a4cbab10483db415b4c8e",
       "style": "IPY_MODEL_6dac9743db8c4571917a37dffdd9b9bf"
      }
     },
     "147f679b31ed47f2991c2803ddd131ba": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "VBoxModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_547eb61abf5e459e9c7eca5bc38352bf",
        "IPY_MODEL_da0d208995f14ef29afb719b12fb4ebd"
       ],
       "layout": "IPY_MODEL_91db8ef9afd1444baaf19125f299da90"
      }
     },
     "15c20c0b0ca6420d84327b7e56b37709": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "16b8815f54fa408b924e06c4871d84cb": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "IntSliderModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "Blue handle",
       "layout": "IPY_MODEL_b7b1012fd71d4ecb8bffd7bbb2743a77",
       "style": "IPY_MODEL_f3db1ec0c4594a78a0e5d3292cfe1bf9"
      }
     },
     "176d7e6fb3594f2bbc4c890de9154a93": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "1794aa990ddf4484aa59a16130b098f4": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "18593949355c40e992fccc328aa9c304": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "1e2b687431a14626b888286813c803d0": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "20e636700cfb4a88b1a12bcf6a3827da": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "21a90e0b84f7465982501d1ba99467b8": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "FloatSliderModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "x",
       "layout": "IPY_MODEL_18593949355c40e992fccc328aa9c304",
       "max": 3,
       "min": -1,
       "step": 0.1,
       "value": 1
      }
     },
     "226dfc631e88463b8c2092676aa9b80f": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "23876984a3cc485b951ac6aee848733d": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "jupyter-js-widgets",
       "_model_module_version": "~2.1.4",
       "_view_module": "jupyter-js-widgets",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_eb57947080ac417e854763f56a0976d8",
       "msg_throttle": 1
      }
     },
     "26121bf4bf51483aa6f520c72cf465c0": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "ButtonModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "Нажмите, чтобы посчитать площадь прямоугольника!",
       "layout": "IPY_MODEL_83b8a6099b4540e48d253c073c905518",
       "style": "IPY_MODEL_b08e489b45c8421591208e8c084b6668"
      }
     },
     "2666bf9773c34c47a52624dc5e0eae88": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "TextModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "x",
       "layout": "IPY_MODEL_f0b6fcb12d5849a7b986eeda922e1fcd",
       "value": "Текст"
      }
     },
     "290f2b24329d4590967cfd59f58d0a94": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "jupyter-js-widgets",
       "_model_module_version": "~2.1.4",
       "_view_module": "jupyter-js-widgets",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_5aa16c88397c42188f0da3e291a2e8f1",
       "msg_throttle": 1
      }
     },
     "29369f26efe642c19f260729d4f5045f": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "ButtonStyleModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "button_color": "lightgreen"
      }
     },
     "2a34abdaa55d4c28aab476752178a56e": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "SelectModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_options_labels": [
        "Компьютер",
        "Планшет",
        "Ноутбук"
       ],
       "_view_module_version": "~2.1.4",
       "description": "Товар:",
       "layout": "IPY_MODEL_aa5f853721fe4d28b6f8cf7151e4a68b",
       "value": "Компьютер"
      }
     },
     "2a7ffc161a2c49ef9b4ba46d4b51da4e": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "2bc9cf07565b490fa37acee2275cab9a": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "2c66fbc27ecd46efa5c65519e7a2c9a2": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "VBoxModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_7ebca7e1b4184bfcae03f242c3eebaa9",
        "IPY_MODEL_7affea610e824c2794eee93468f5db9d"
       ],
       "layout": "IPY_MODEL_b971344925b246f2bb51e09234e9c720"
      }
     },
     "3062bdfe8eed418f8ff55fcb884a0c34": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "ToggleButtonsModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_options_labels": [
        "Карта",
        "Наличные"
       ],
       "_view_module_version": "~2.1.4",
       "button_style": "success",
       "description": "Способ оплаты:",
       "icons": [
        "credit-card",
        "money"
       ],
       "layout": "IPY_MODEL_ff7f11d9ab35423a88b19e9f2db797c4",
       "tooltips": [
        "Карта",
        "Наличные"
       ],
       "value": "Карта"
      }
     },
     "35f8c3e4f84e448db6c8dd7586280f46": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "38325c1767a0408c96bfd50b0aad5dea": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "3b70bbfa51e74d64be0e4a46abfca0d0": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "3d1cf3bbf0f6441ab714b612809afbd1": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "423b3ab55ce549d9afb26a1f54a54b49": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "SliderStyleModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "451c88eaa7914541b1894692f3646320": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "VBoxModel",
      "state": {
       "_dom_classes": [
        "widget-interact"
       ],
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_47117093c8ef4570b17e2916878a706f",
        "IPY_MODEL_a299c5ab06964b05a41cb0666a95d20a",
        "IPY_MODEL_671cfaf2de6a4eadb6ec4f860e8b51c4"
       ],
       "layout": "IPY_MODEL_9ca9087a112c4a20b9c55b8cd1ce552a"
      }
     },
     "462d94f04aa842fe8527ead0a26c5d38": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "AccordionModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_titles": {
        "0": "Товар:",
        "1": "Количество:",
        "2": "Мощность:",
        "3": "Бонус:"
       },
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_2a34abdaa55d4c28aab476752178a56e",
        "IPY_MODEL_8952f560d7524fb1bded540f774d11a3",
        "IPY_MODEL_0cadd83fecb14d4c8b041c76662d3994",
        "IPY_MODEL_64dc059fea83407cb3d1e40fbe2d05ca"
       ],
       "layout": "IPY_MODEL_1e2b687431a14626b888286813c803d0"
      }
     },
     "46a0abb421b74977b1e1f30af82416e2": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "SliderStyleModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "47117093c8ef4570b17e2916878a706f": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "IntSliderModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "Высота",
       "layout": "IPY_MODEL_8e304c77ec27420f988b91e5368641dc",
       "max": 40,
       "min": 2,
       "step": 2,
       "style": "IPY_MODEL_b5e94255306f4a1b94e7fb9809283888",
       "value": 2
      }
     },
     "49b47343df2a4be4b532fd3affce7967": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "width": "40%"
      }
     },
     "4f4dba9d7a8947db9cbc96b11930a6bb": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "ButtonModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "Использовать другие данные",
       "layout": "IPY_MODEL_c41f7c7a0f444cc49243c52a6b34ea78",
       "style": "IPY_MODEL_bd07d99430c648c1b885e9b0ea7cc71f"
      }
     },
     "4fedfe8721b843ba8cee87b8a704fe7b": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "ButtonModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "Custom color",
       "layout": "IPY_MODEL_7ca0c44725a74bd589f668563a6f3d76",
       "style": "IPY_MODEL_29369f26efe642c19f260729d4f5045f"
      }
     },
     "52d00f86a86f40eb99c8bef58d22a477": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "IntSliderModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_20e636700cfb4a88b1a12bcf6a3827da",
       "style": "IPY_MODEL_98bc990e46cb4ea889d5a68910ca19ca"
      }
     },
     "547eb61abf5e459e9c7eca5bc38352bf": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LabelModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_6475034df27448de92b0580974cb73b9",
       "value": "Дата доставки:"
      }
     },
     "599f832532c546d9abc1e111e0672d22": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "ButtonStyleModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "5aa16c88397c42188f0da3e291a2e8f1": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "5aaf92a2625242ae8d414eae7d07febe": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "TextModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "Комментарий к доставке:",
       "layout": "IPY_MODEL_226dfc631e88463b8c2092676aa9b80f",
       "value": " "
      }
     },
     "5e02596d39db4b7992939229594b0ca8": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "jupyter-js-widgets",
       "_model_module_version": "~2.1.4",
       "_view_module": "jupyter-js-widgets",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_15c20c0b0ca6420d84327b7e56b37709",
       "msg_throttle": 1
      }
     },
     "5f2c897ab8994486af6a131a0c1a3836": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "5f94ce02fa1b4b9885922606f41a24ac": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "HBoxModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_a566fb250b8541b597c9cefb3baf676a",
        "IPY_MODEL_769f0c4884704d40835c62c894df66bf"
       ],
       "layout": "IPY_MODEL_0c998e92497e4ac59852e2e69180b09e"
      }
     },
     "60a8205d69bb46bebe9034d5972d89f0": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "632fa0a3eee242779f96a889ffe68ef5": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "6475034df27448de92b0580974cb73b9": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "64dc059fea83407cb3d1e40fbe2d05ca": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "SelectMultipleModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_options_labels": [
        "Ручка",
        "Стикер",
        "Скидка"
       ],
       "_view_module_version": "~2.1.4",
       "description": "Бонусы",
       "layout": "IPY_MODEL_632fa0a3eee242779f96a889ffe68ef5",
       "value": [
        "Стикер"
       ]
      }
     },
     "671cfaf2de6a4eadb6ec4f860e8b51c4": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "jupyter-js-widgets",
       "_model_module_version": "~2.1.4",
       "_view_module": "jupyter-js-widgets",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_85f763bec07c471f8d1ec1840ad603be",
       "msg_throttle": 1
      }
     },
     "6c435d315a494a6783735288c8c63ecd": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "6d3f176a7ae04176a6ff01fafb95cdc6": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "DropdownModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_options_labels": [
        "2",
        "3",
        "4",
        "5"
       ],
       "_view_module_version": "~2.1.4",
       "description": "n",
       "layout": "IPY_MODEL_075b4f6bf6e040dda2cd918a928e98fa",
       "value": "3"
      }
     },
     "6d3f95ca634941f9984fe2285b8ca774": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "6dac9743db8c4571917a37dffdd9b9bf": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "SliderStyleModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "6e3d9e6050e84f12bb1b26dcc5bc5ccf": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "707c07dd0a8a40b489c17c1f5318969b": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "7327540bb8f443af95f337e02cbfe45c": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "73d6948a2b144ccebbc9ddde540ec813": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "VBoxModel",
      "state": {
       "_dom_classes": [
        "widget-interact"
       ],
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_e564261a6fe2420db22be07ada6d90dd",
        "IPY_MODEL_290f2b24329d4590967cfd59f58d0a94"
       ],
       "layout": "IPY_MODEL_fb4710ea1c1d44a7b194d0e341f11236"
      }
     },
     "75d7d4bca2a2471fb6912c397a81a77e": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "769f0c4884704d40835c62c894df66bf": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "RadioButtonsModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_options_labels": [
        "Доставка",
        "Самовывоз"
       ],
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_7fec9c880d9c4e7fb31eab3e8ce96108",
       "value": "Доставка"
      }
     },
     "7a5f0a89d0644bafb645304a53433924": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "VBoxModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_d098041c0e564cb498a6f0343889bf3d",
        "IPY_MODEL_da0d208995f14ef29afb719b12fb4ebd"
       ],
       "layout": "IPY_MODEL_6e3d9e6050e84f12bb1b26dcc5bc5ccf"
      }
     },
     "7affea610e824c2794eee93468f5db9d": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "ProgressModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "bar_style": "success",
       "layout": "IPY_MODEL_1794aa990ddf4484aa59a16130b098f4",
       "max": 10,
       "style": "IPY_MODEL_9dcea31c79e343249915ec98129a2dae",
       "value": 10
      }
     },
     "7ca0c44725a74bd589f668563a6f3d76": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "7cf534ae09514ec2aae1b1acf3716b4e": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "7dca8daf6ba0440ebe0de0594fc150fe": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "VBoxModel",
      "state": {
       "_dom_classes": [
        "widget-interact"
       ],
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_21a90e0b84f7465982501d1ba99467b8",
        "IPY_MODEL_8c239f3bc44c47b0988080951ca682dc"
       ],
       "layout": "IPY_MODEL_e1429c177eca4898964f8c2ae0a03d60"
      }
     },
     "7e9bf66be9964946808d5b2d808809f6": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "7ebca7e1b4184bfcae03f242c3eebaa9": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LabelModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_e92e737ede5846f2a0d96e2d051be9fe",
       "value": "Проверка информации  заказе:"
      }
     },
     "7fdd8d99f2d541739ebe43e97389b013": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "VBoxModel",
      "state": {
       "_dom_classes": [
        "widget-interact"
       ],
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_914ce2eddf154734bb1fb86a22dfcc9e",
        "IPY_MODEL_b70bb946a9724446a83ce5aeb632ae66"
       ],
       "layout": "IPY_MODEL_dd9205fb52a54de4aa75e0340d46b372"
      }
     },
     "7fec9c880d9c4e7fb31eab3e8ce96108": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "83b8a6099b4540e48d253c073c905518": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "width": "40%"
      }
     },
     "84889309bd8c4299938bd383eb120358": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "8509793627964de9b59bb736a410f84c": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "85f763bec07c471f8d1ec1840ad603be": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "8952f560d7524fb1bded540f774d11a3": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "IntSliderModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_6d3f95ca634941f9984fe2285b8ca774",
       "max": 5,
       "min": 1,
       "style": "IPY_MODEL_f4346902574146ac9cf0b70d6234cfea",
       "value": 1
      }
     },
     "8bace233ef15420c85416c33192009e3": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "width": "40%"
      }
     },
     "8c239f3bc44c47b0988080951ca682dc": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "jupyter-js-widgets",
       "_model_module_version": "~2.1.4",
       "_view_module": "jupyter-js-widgets",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_3b70bbfa51e74d64be0e4a46abfca0d0",
       "msg_throttle": 1
      }
     },
     "8d9379a229b54889a4b60e971ca4a660": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "8e304c77ec27420f988b91e5368641dc": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "914ce2eddf154734bb1fb86a22dfcc9e": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "DropdownModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_options_labels": [
        "лопата",
        "солнце"
       ],
       "_view_module_version": "~2.1.4",
       "description": "x",
       "layout": "IPY_MODEL_75d7d4bca2a2471fb6912c397a81a77e",
       "value": "лопата"
      }
     },
     "91a1a1ce1ff34f1fa1f0622019e747ed": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "IntTextModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_60a8205d69bb46bebe9034d5972d89f0",
       "max": 5,
       "min": 1,
       "step": 1,
       "value": 1
      }
     },
     "91db8ef9afd1444baaf19125f299da90": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "9595a8bd10d34989838d313399a73613": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "VBoxModel",
      "state": {
       "_dom_classes": [
        "widget-interact"
       ],
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_6d3f176a7ae04176a6ff01fafb95cdc6",
        "IPY_MODEL_9f1c129538b747bb8abc07a7cb5e1b67",
        "IPY_MODEL_23876984a3cc485b951ac6aee848733d"
       ],
       "layout": "IPY_MODEL_3d1cf3bbf0f6441ab714b612809afbd1"
      }
     },
     "96b05807ff314201b0115ffda11b8b27": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "VBoxModel",
      "state": {
       "_dom_classes": [
        "widget-interact"
       ],
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_2666bf9773c34c47a52624dc5e0eae88",
        "IPY_MODEL_ac5e4588c54d4045a37b5c653eecadea"
       ],
       "layout": "IPY_MODEL_fe203e67f038436eab8af669e3e459f0"
      }
     },
     "98bc990e46cb4ea889d5a68910ca19ca": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "SliderStyleModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "9ca9087a112c4a20b9c55b8cd1ce552a": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "9d060407a58f47f685b13c2f68687542": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "9dcea31c79e343249915ec98129a2dae": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "9f1c129538b747bb8abc07a7cb5e1b67": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "ColorPickerModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "Цвет линии:",
       "layout": "IPY_MODEL_35f8c3e4f84e448db6c8dd7586280f46",
       "value": "teal"
      }
     },
     "a299c5ab06964b05a41cb0666a95d20a": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "FloatSliderModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "Ширина",
       "layout": "IPY_MODEL_0e7a623192da41a49210e53035dae6ea",
       "max": 80,
       "min": 2,
       "step": 0.5,
       "value": 5
      }
     },
     "a4fccf4b5a794d7aa8746b1e1c786ff0": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "VBoxModel",
      "state": {
       "_dom_classes": [
        "widget-interact"
       ],
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_f2f47204a9df4eafb76ed79efe4abda0",
        "IPY_MODEL_c9003085e2354e14b34ba6c14a7e7a51"
       ],
       "layout": "IPY_MODEL_8509793627964de9b59bb736a410f84c"
      }
     },
     "a566fb250b8541b597c9cefb3baf676a": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LabelModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_c8df7e6ea5bd422eaf2988bae439e63e",
       "value": "Способ доставки:"
      }
     },
     "aa5f853721fe4d28b6f8cf7151e4a68b": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "ac5c8bed1f3c43a5bcabc3128c2f2c0b": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "jupyter-js-widgets",
       "_model_module_version": "~2.1.4",
       "_view_module": "jupyter-js-widgets",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_c82424b246a14afcac64b3b3e6dfb48e",
       "msg_throttle": 1
      }
     },
     "ac5e4588c54d4045a37b5c653eecadea": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "jupyter-js-widgets",
       "_model_module_version": "~2.1.4",
       "_view_module": "jupyter-js-widgets",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_9d060407a58f47f685b13c2f68687542",
       "msg_throttle": 1
      }
     },
     "af2b4846ab9e41bc8e0afff96433aa28": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "DropdownModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_options_labels": [
        "Сумма",
        "Произведение"
       ],
       "_view_module_version": "~2.1.4",
       "description": "z",
       "layout": "IPY_MODEL_cdc41ae6e4d441a08650b78876081d7a",
       "value": "Сумма"
      }
     },
     "b08e489b45c8421591208e8c084b6668": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "ButtonStyleModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "b4949545670b46dc8ecb339eaffc27f8": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "VBoxModel",
      "state": {
       "_dom_classes": [
        "widget-interact"
       ],
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_bf06f67f55de4bd3b59a9702866c2dc9",
        "IPY_MODEL_0c10bd7b484a4923a0fd7dd0ffca17e1",
        "IPY_MODEL_af2b4846ab9e41bc8e0afff96433aa28",
        "IPY_MODEL_5e02596d39db4b7992939229594b0ca8"
       ],
       "layout": "IPY_MODEL_84889309bd8c4299938bd383eb120358"
      }
     },
     "b58436b044644bf2aecccadc85eef13a": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "b5e94255306f4a1b94e7fb9809283888": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "SliderStyleModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "b70bb946a9724446a83ce5aeb632ae66": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "jupyter-js-widgets",
       "_model_module_version": "~2.1.4",
       "_view_module": "jupyter-js-widgets",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_7327540bb8f443af95f337e02cbfe45c",
       "msg_throttle": 1
      }
     },
     "b7b1012fd71d4ecb8bffd7bbb2743a77": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "b971344925b246f2bb51e09234e9c720": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "b9e75d45bd624e91b7ebaa0e4cb3e5ac": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "bd07d99430c648c1b885e9b0ea7cc71f": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "ButtonStyleModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "bd792bd8ea4a4cbab10483db415b4c8e": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "be59f9d0f75f47dbb0829d682fbc9d73": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "VBoxModel",
      "state": {
       "_dom_classes": [
        "widget-interact"
       ],
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_eba6b99dec1d4d9bbc8614f6e249f263",
        "IPY_MODEL_f5cad9ee20ad4497982b4c73d2046b52"
       ],
       "layout": "IPY_MODEL_b58436b044644bf2aecccadc85eef13a"
      }
     },
     "bf06f67f55de4bd3b59a9702866c2dc9": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "IntSliderModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "x",
       "layout": "IPY_MODEL_c8b703b010d84226a7ec88d8b2442389",
       "max": 3,
       "min": -1,
       "style": "IPY_MODEL_46a0abb421b74977b1e1f30af82416e2",
       "value": 1
      }
     },
     "c087cf67b3a64f0c98feb7f12fe5859c": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "AccordionModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_titles": {
        "0": "Способ доставки:",
        "1": "Способ оплаты:",
        "2": "Дата доставки:",
        "3": "Время доставки:",
        "4": "Комментарий:",
        "5": "Адрес доставки:"
       },
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_5f94ce02fa1b4b9885922606f41a24ac",
        "IPY_MODEL_3062bdfe8eed418f8ff55fcb884a0c34",
        "IPY_MODEL_7a5f0a89d0644bafb645304a53433924",
        "IPY_MODEL_f2b9a33add4349f3ac5ed82883485403",
        "IPY_MODEL_5aaf92a2625242ae8d414eae7d07febe",
        "IPY_MODEL_ee82033844b94ee08658134b2f50e923"
       ],
       "layout": "IPY_MODEL_8d9379a229b54889a4b60e971ca4a660"
      }
     },
     "c12c72ab2deb46ac845ef2f6c46eb0e4": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "c41f7c7a0f444cc49243c52a6b34ea78": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "width": "40%"
      }
     },
     "c4cffe42bbc74e15963d4fc81cc3dc02": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "c82424b246a14afcac64b3b3e6dfb48e": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "c8b703b010d84226a7ec88d8b2442389": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "c8df7e6ea5bd422eaf2988bae439e63e": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "c9003085e2354e14b34ba6c14a7e7a51": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "jupyter-js-widgets",
       "_model_module_version": "~2.1.4",
       "_view_module": "jupyter-js-widgets",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_b9e75d45bd624e91b7ebaa0e4cb3e5ac",
       "msg_throttle": 1
      }
     },
     "cbeb511f310e4b1a96f39359957f9793": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LabelModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_6c435d315a494a6783735288c8c63ecd",
       "value": "Способ доставки:"
      }
     },
     "cdc41ae6e4d441a08650b78876081d7a": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "d098041c0e564cb498a6f0343889bf3d": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LabelModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_c12c72ab2deb46ac845ef2f6c46eb0e4",
       "value": "Дата доставки:"
      }
     },
     "d0f25e66340b41b7b4f1250e5a3c9d6b": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "ButtonModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "Проверить дату",
       "layout": "IPY_MODEL_49b47343df2a4be4b532fd3affce7967",
       "style": "IPY_MODEL_599f832532c546d9abc1e111e0672d22"
      }
     },
     "da0d208995f14ef29afb719b12fb4ebd": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "DatePickerModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_38325c1767a0408c96bfd50b0aad5dea"
      }
     },
     "dd9205fb52a54de4aa75e0340d46b372": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "e06bed981b8147c0ba7eeaffe888f3be": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "e1429c177eca4898964f8c2ae0a03d60": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "e3d4a171a09c45d3af864eb0146bbee6": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "HBoxModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_cbeb511f310e4b1a96f39359957f9793",
        "IPY_MODEL_769f0c4884704d40835c62c894df66bf"
       ],
       "layout": "IPY_MODEL_2bc9cf07565b490fa37acee2275cab9a"
      }
     },
     "e5481e5a297148cb9e73950df5edcf79": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LinkModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "source": [
        "IPY_MODEL_91a1a1ce1ff34f1fa1f0622019e747ed",
        "value"
       ],
       "target": [
        "IPY_MODEL_8952f560d7524fb1bded540f774d11a3",
        "value"
       ]
      }
     },
     "e564261a6fe2420db22be07ada6d90dd": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "CheckboxModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "x",
       "disabled": false,
       "layout": "IPY_MODEL_e06bed981b8147c0ba7eeaffe888f3be",
       "value": true
      }
     },
     "e92e737ede5846f2a0d96e2d051be9fe": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "eb57947080ac417e854763f56a0976d8": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "eba6b99dec1d4d9bbc8614f6e249f263": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "DropdownModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_options_labels": [
        "sepal length (cm)",
        "sepal width (cm)",
        "petal length (cm)",
        "petal width (cm)"
       ],
       "_view_module_version": "~2.1.4",
       "description": "x",
       "layout": "IPY_MODEL_c4cffe42bbc74e15963d4fc81cc3dc02",
       "value": "sepal length (cm)"
      }
     },
     "ec14889d1d0648d08469f13b5fbc394f": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "CheckboxModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "Check me",
       "disabled": false,
       "layout": "IPY_MODEL_7e9bf66be9964946808d5b2d808809f6",
       "value": false
      }
     },
     "ee82033844b94ee08658134b2f50e923": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "TextareaModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "Адрес:",
       "layout": "IPY_MODEL_5f2c897ab8994486af6a131a0c1a3836",
       "placeholder": "Не дом и не улица",
       "value": "Адрес"
      }
     },
     "f0b6fcb12d5849a7b986eeda922e1fcd": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "f2b9a33add4349f3ac5ed82883485403": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "IntSliderModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_range": true,
       "_view_module_version": "~2.1.4",
       "continuous_update": false,
       "description": "Время:",
       "layout": "IPY_MODEL_2a7ffc161a2c49ef9b4ba46d4b51da4e",
       "max": 22,
       "min": 7,
       "slider_color": null,
       "value": [
        9,
        18
       ]
      }
     },
     "f2f47204a9df4eafb76ed79efe4abda0": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "IntSliderModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "description": "x",
       "layout": "IPY_MODEL_f6168b3dd9e24faf8e9d81410277d108",
       "max": 30,
       "min": -10,
       "style": "IPY_MODEL_423b3ab55ce549d9afb26a1f54a54b49",
       "value": 10
      }
     },
     "f3db1ec0c4594a78a0e5d3292cfe1bf9": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "SliderStyleModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4",
       "handle_color": "lightblue"
      }
     },
     "f4346902574146ac9cf0b70d6234cfea": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "SliderStyleModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "f5cad9ee20ad4497982b4c73d2046b52": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "jupyter-js-widgets",
       "_model_module_version": "~2.1.4",
       "_view_module": "jupyter-js-widgets",
       "_view_module_version": "~2.1.4",
       "layout": "IPY_MODEL_707c07dd0a8a40b489c17c1f5318969b",
       "msg_throttle": 1
      }
     },
     "f6168b3dd9e24faf8e9d81410277d108": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "f975cebcbc06446aa7b959d50c617a48": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "TabModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_titles": {
        "0": "Заказ:",
        "1": "Доставка:"
       },
       "_view_module_version": "~2.1.4",
       "children": [
        "IPY_MODEL_462d94f04aa842fe8527ead0a26c5d38",
        "IPY_MODEL_c087cf67b3a64f0c98feb7f12fe5859c"
       ],
       "layout": "IPY_MODEL_176d7e6fb3594f2bbc4c890de9154a93"
      }
     },
     "fb4710ea1c1d44a7b194d0e341f11236": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "fe203e67f038436eab8af669e3e459f0": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     },
     "ff7f11d9ab35423a88b19e9f2db797c4": {
      "model_module": "jupyter-js-widgets",
      "model_module_version": "~2.1.4",
      "model_name": "LayoutModel",
      "state": {
       "_model_module_version": "~2.1.4",
       "_view_module_version": "~2.1.4"
      }
     }
    },
    "version_major": 1,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
